﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using PraceDyplomowe2.Models;
using WebMatrix.WebData;

namespace PraceDyplomowe2.Controllers
{
    
    public class AdministracjaController : Controller
    {
        private PraceDyplomoweEntities db = new PraceDyplomoweEntities();

        //
        // GET: /Administracja/
        [Authorize(Roles = "Administrator")]
        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: /Account/Register
        [Authorize(Roles = "Administrator")]
        [AllowAnonymous]
        public ActionResult Register()
        {
            return View();
        }

        //
        // POST: /Account/Register
        [Authorize(Roles = "Administrator")]
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                try
                {

                    var roles = (SimpleRoleProvider)Roles.Provider;
                    var membership = (SimpleMembershipProvider)Membership.Provider;

                    if (membership.GetUser(model.UserName, false) == null)
                    {
                        WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
                         propertyValues: new
                         {
                             //UserId = ,
                             Imie = model.Imie,
                             Nazwisko = model.Nazwisko,
                             Rola_RolaId = model.Rola,
                             WydzialId = model.WydzialId,
                             KierunekStudiow_KierunekStudiowId = model.KierunekStudiow,
                             PoziomStudiow_PoziomStudiowId = model.PoziomStudiow


                         });
                    }

                    var rola_strona = db.Role.Where(t => t.RolaId == model.Rola);

                    if (!roles.GetRolesForUser(model.UserName).Contains(rola_strona.First().Nazwa))
                    {
                        roles.AddUsersToRoles(new[] { model.UserName }, new[] { rola_strona.First().Nazwa });

                    }
                    WebSecurity.Login(model.UserName, model.Password);
                    return RedirectToAction("Index", "Home");
                }
                catch (MembershipCreateUserException e)
                {
                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }



        [Authorize(Roles = "Administrator, Promotor")]
        public ActionResult ListaStudentow()
        {
            return View(db.UserProfiles.Where(up => up.Rola.Nazwa == Rola.StudentNazwa).ToList());
        }

        

        public ActionResult DetailsStudent(int id = 0)
        {
            if (id == 0)
            {
                return View(db.UserProfiles.Single(up => up.UserName == User.Identity.Name));
            }

            UserProfile student = db.UserProfiles.Find(id);
            if (student == null)
            {
                return HttpNotFound();
            }

            return View(student);
        }

        [Authorize(Roles = "Administrator, Promotor, Student")]
        public ActionResult ListaPromotorow()
        {
            return View(db.UserProfiles.Where(up => up.Rola.Nazwa == Rola.PromotorNazwa));
        }

        [Authorize(Roles = "Administrator, Promotor, Student")]
        public ActionResult DetailsPromotor(int id = 0)
        {
            if (id == 0)
            {
                return View(db.UserProfiles.Single(up => up.UserName == User.Identity.Name));
            }

            UserProfile promotor = db.UserProfiles.Find(id);
            if (promotor == null)
            {
                return HttpNotFound();
            }

            return View(promotor);
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // See http://go.microsoft.com/fwlink/?LinkID=177550 for
            // a full list of status codes.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "Użytkownik już istnieje.Wprowadź inny login.";

              

                case MembershipCreateStatus.InvalidPassword:
                    return "Niepoprawne hasło.Wprowadź poprawne hasło.";

                case MembershipCreateStatus.InvalidUserName:
                    return "Nieprawidłowa nazwa użytkownika. Wprowadź ponownie poprawną nazwę.";

                case MembershipCreateStatus.ProviderError:
                    return "System zwrócił błąd atentykacji. Spróbój ponownie.Jeśli błąd się powtórzy skontatkuj się z administratorem systemu";

                case MembershipCreateStatus.UserRejected:
                    return "Próba stworzenia użytkownika została odrzucona. Spróbój ponownie.Jeśli błąd się powtórzy skontatkuj się z administratorem systemu";

                default:
                    return "System zwrócił nierozpoznany błąd. Spróbój ponownie.Jeśli błąd się powtórzy skontatkuj się z administratorem systemu.";
            }
        }
    }
}